#include "../include/deng.h"

// 双链表的创建(名单)
Link_list *init_link_list(void)
{
    // 1 创建 头节点的动态空间
    Link_list *list = (Link_list *)malloc(sizeof(Link_list));
    if (NULL == list)
    {
        printf("创建失败\n");
        return NULL;
    }

    list->next = NULL;

    return list;
}

// 双链表的创建(航班)
Link_hang *init_link_hang(void)
{
    // 1 创建 头节点的动态空间
    Link_hang *list = (Link_hang *)malloc(sizeof(Link_hang));
    if (NULL == list)
    {
        printf("创建失败\n");
        return NULL;
    }

    list->next = NULL;

    return list;
}

// 双链表的销毁
void free_link_list(Link_list **list)
{
    if (NULL == *list)
    {
        printf("链表 为 NULL\n");
        return;
    }

    // 1 销毁结点
    Node *ptr_1 = (*list)->next;
    for (size_t i = 0; ptr_1 != NULL; i++)
    {
        free(ptr_1);
        // if 判断  判断 ptr2 = NULL 的时候 我们如何处理
        ptr_1 = ptr_1->next;
    }

    // 2 销毁头结点
    free(*list);
    *list = NULL;
}

// 双链表的销毁(航班)
void free_link_hang(Link_hang **list)
{
    if (NULL == *list)
    {
        printf("链表 为 NULL\n");
        return;
    }
    Link_hang *p = (*list);
    // 1 销毁结点
    hang *ptr_1 = p->next;
    for (size_t i = 0; ptr_1 != NULL; i++)
    {
        free(ptr_1);
        // if 判断  判断 ptr2 = NULL 的时候 我们如何处理
        ptr_1 = ptr_1->next;
    }

    // 2 销毁头结点
    free(*list);
    // *list = NULL;
}

// 双链表的遍历(名单)
void print_link_list(Link_list *L)
{
    char dengji[10];
    Node *ptr = L->next;
    printf("|用户类型\t|账号\t|密码\t|用户名\t|用户余额\t|用户会员\t|\n");
    for (size_t i = 0; ptr != NULL; i++)
    {
        root_dengji(ptr->data.vip, dengji);
        printf("|%s\t\t|%s\t|%s\t|%s\t|%d\t\t|%s\t\t|\n",
               ptr->data.userType, ptr->data.id, ptr->data.pos,
               ptr->data.name, ptr->data.value, dengji);
        ptr = ptr->next;
    }
}

// 双链表的遍历(一个)
void print_link_list_1(Node *ptr)
{
    char dengji[10];
    root_dengji(ptr->data.vip, dengji);
    printf("|用户类型\t|账号\t|密码\t|用户名\t|用户余额\t|用户会员\t|\n");
    printf("|%s\t\t|%s\t|%s\t|%s\t|%d\t\t|%s\t\t|\n",
           ptr->data.userType, ptr->data.id, ptr->data.pos,
           ptr->data.name, ptr->data.value, dengji);
}

// 双链表的遍历(航班)
void print_link_hang(Link_hang *L)
{
    hang *ptr_1 = L->next;
    printf("|航班号\t|起点站\t|终点站\t|班期\t\t|机型\t\t|起飞时间\t|到达时间\t|票价\t|额定载客量\t|剩余座位数量\t|是否起飞\t|\n");
    for (size_t i = 0; ptr_1 != NULL; i++)
    {
        printf("|%s\t|%s\t|%s\t|%s\t|%s\t|%s\t\t|%s\t\t|%d\t|%d\t\t|%d\t\t|%c\t\t|\n",
               ptr_1->data.number, ptr_1->data.staddress, ptr_1->data.arraddress, ptr_1->data.DATE,
               ptr_1->data.TYPE, ptr_1->data.stime, ptr_1->data.atime, ptr_1->data.value, ptr_1->data.maxNUM, ptr_1->data.leftbuyersa, ptr_1->data.whetherfly);
        ptr_1 = ptr_1->next;
    }
    return;
}

// 双链表的遍历(一个航班)
void print_link_hang_1(hang *ptr_1)
{
    printf("|航班号\t|起点站\t|终点站\t|班期\t\t|机型\t\t|起飞时间\t|到达时间\t|票价\t|额定载客量\t|剩余座位数量\t|是否起飞\t|\n");
    printf("|%s\t|%s\t|%s\t|%s\t|%s\t|%s\t\t|%s\t\t|%d\t|%d\t\t|%d\t\t|%c\t\t|\n",
           ptr_1->data.number, ptr_1->data.staddress, ptr_1->data.arraddress, ptr_1->data.DATE,
           ptr_1->data.TYPE, ptr_1->data.stime, ptr_1->data.atime, ptr_1->data.value, ptr_1->data.maxNUM, ptr_1->data.leftbuyersa, ptr_1->data.whetherfly);
}

// 航班所有信息打印

// 链表的打印到文件里(花名册)
void fprint_wen(Link_list *L)
{
    FILE *fp = file_open("花名册.txt", "w");
    Node *ptr = L->next;
    for (size_t i = 0; ptr != NULL; i++)
    {
        fprintf(fp, "%s;%s;%s;%s;%d;%d\n",
                ptr->data.userType, ptr->data.id, ptr->data.pos, ptr->data.name, ptr->data.value, ptr->data.vip);
        ptr = ptr->next;
    }
    file_close(&fp);
}

// 链表的打印到文件里(航班)
void fprint_hang(Link_hang *L)
{
    FILE *fp = file_open("航班信息.txt", "w");
    hang *ptr_1 = L->next;
    for (size_t i = 0; ptr_1 != NULL; i++)
    {
        fprintf(fp, "%s;%s;%s;%s;%s;%s;%s;%d;%d;%d;%c\n",
                ptr_1->data.number, ptr_1->data.staddress, ptr_1->data.arraddress, ptr_1->data.DATE,
                ptr_1->data.TYPE, ptr_1->data.stime, ptr_1->data.atime, ptr_1->data.value, ptr_1->data.maxNUM,
                ptr_1->data.leftbuyersa, ptr_1->data.whetherfly);
        ptr_1 = ptr_1->next;
    }
    file_close(&fp);
}

// 链表的打印到文件里(记录)
void fprint_jilu(Link_list *L)
{
    FILE *fp_2 = file_open("航班记录.txt", "w");
    Node *ptr_2 = L->next;
    for (size_t i = 0; ptr_2 != NULL; i++)
    {
        for (int j = 0; j < ptr_2->data.a.len; j++)
        {
            // printf("%s;%s;%d\n",ptr_2->data.name, ptr_2->data.a.data[j].name, ptr_2->data.a.len);
            fprintf(fp_2, "%s;%s\n", ptr_2->data.name, ptr_2->data.a.data[j].name);
        }
        ptr_2 = ptr_2->next;
    }
    file_close(&fp_2);
}

// 双链表的插入
void insert_node(Link_list *list, Elenemt_data data, int index)
{
    Node *new_node = (Node *)malloc(sizeof(Node)); // 建立一个新的空间去存储数据
    new_node->data.a.len = 0;
    if (NULL == new_node)
    {
        printf("创建新节点失败\n");
        return;
    }

    new_node->data = data; // 存储数据
    new_node->next = NULL;
    new_node->prev = NULL;

    if (index == 1) // 头插
    {
        toucha(list, new_node);
        return;
    }

    if (num(list) == index - 1) // 尾插
    {
        weicha(list, new_node);
        return;
    }

    Node *ptr_1 = list->next;
    // 1 找到要插入的位置的前一个节点
    for (int i = 1; i < index - 1; i++)
    {
        ptr_1 = ptr_1->next;
    }
    // 2 接入新节点
    new_node->next = ptr_1->next;
    ptr_1->next->prev = new_node;
    ptr_1->next = new_node;
    new_node->prev = ptr_1;
    return;
}

// 双链表的插入(航班)
void insert_hang(Link_hang *list, Data_type data, int index)
{
    hang *new_node = (hang *)malloc(sizeof(hang)); // 建立一个新的空间去存储数据
    if (NULL == new_node)
    {
        printf("创建新节点失败\n");
        return;
    }

    new_node->data = data; // 存储数据
    new_node->next = NULL;
    new_node->prev = NULL;

    if (index == 1) // 头插
    {
        toucha_hang(list, new_node);
        return;
    }

    if (num_hang(list) == index - 1) // 尾插
    {
        weicha_hang(list, new_node);
        return;
    }

    hang *ptr_1 = list->next;
    // 1 找到要插入的位置的前一个节点
    for (int i = 1; i < index - 1; i++)
    {
        ptr_1 = ptr_1->next;
    }
    // 2 接入新节点
    new_node->next = ptr_1->next;
    ptr_1->next->prev = new_node;
    ptr_1->next = new_node;
    new_node->prev = ptr_1;
    return;
}

// 双链表的头插
void toucha(Link_list *list, Node *data)
{
    if (list->next == NULL) // 第一个节点没有数据
    {
        data->next = list->next;
        list->next = data;
        return;
    }
    else // 第一个节点有数据
    {
        data->next = list->next;
        list->next = data;
        return;
    }
}

// 双链表的头插(航班)
void toucha_hang(Link_hang *list, hang *data)
{
    if (list->next == NULL) // 第一个节点没有数据
    {
        data->next = list->next;
        list->next = data;
        return;
    }
    else // 第一个节点有数据
    {
        data->next = list->next;
        list->next = data;
        return;
    }
}

// 链表的数目
int num(Link_list *list)
{
    Node *ptr = list->next;
    int count = 0;
    while (ptr != NULL)
    {
        count++;
        ptr = ptr->next;
    }
    return count;
}

// 链表的数目(航班)
int num_hang(Link_hang *list)
{
    hang *ptr = list->next;
    int count = 0;
    while (ptr != NULL)
    {
        count++;
        ptr = ptr->next;
    }
    return count;
}

// 尾插
void weicha(Link_list *list, Node *data)
{

    if (list->next == NULL) // 第一个数据为空
    {
        list->next = data;
        return;
    }
    Node *ptr = list->next;
    while (ptr->next != NULL)
    {
        ptr = ptr->next;
    }
    ptr->next = data;
    data->prev = ptr;
    return;
}

// 尾插(航班)
void weicha_hang(Link_hang *list, hang *data)
{

    if (list->next == NULL) // 第一个数据为空
    {
        list->next = data;
        return;
    }
    hang *ptr = list->next;
    while (ptr->next != NULL)
    {
        ptr = ptr->next;
    }
    ptr->next = data;
    data->prev = ptr;
    return;
}

// 尾删
void weishan(Link_list *list)
{
    Node *ptr = list->next;
    while (ptr->next->next != NULL) // 移动到尾节点的前一个
    {
        ptr = ptr->next;
    }
    free(ptr->next);
    ptr->next->prev = NULL;
    ptr->next = NULL;
    return;
}

// 任意位置删除
void renyishan(Link_list *list, int pos)
{
    if (pos == 1) // 删除头
    {
        if (num(list) == 1) // 只有一个成员的时候
        {
            free(list->next);
            list->next = NULL;
            return;
        }
        else
        {
            free(list->next);
            list->next = list->next->next;
            list->next->prev = NULL;
            return;
        }
    }
    if (pos == num(list)) // 尾删
    {
        weishan(list);
        return;
    }
    Node *ptr_1 = list->next;
    // 1 找到要删除的位置的前一个节点
    for (int i = 1; i < pos - 1; i++)
    {
        ptr_1 = ptr_1->next;
    }
    // 2 清空节点
    free(ptr_1->next);
    // 3 使ptr_1的next指向下下个节点
    ptr_1->next->prev = NULL;
    ptr_1->next = ptr_1->next->next;
    ptr_1->next->prev->next = NULL;
    ptr_1->next->prev = ptr_1;
    return;
}

// 链表的查找(位置)
Node *find_node_id(Link_list *list, int index)
{
    Node *ptr = list->next;
    for (int i = 1; i < index; i++)
    {
        if (ptr == NULL)
        {
            printf("在链表中找不到第 %d 个节点\n", index);
            return NULL;
        }
        ptr = ptr->next;
    }
    return ptr;
}

// 单链表的查找(名字)
Node *find_node_name(Link_list *list, char *name)
{
    Node *ptr = list->next;
    for (int i = 1;; i++)
    {
        if (ptr == NULL)
        {
            printf("在链表中找不到 %s 的信息\n", name);
            return NULL;
        }
        if (strcmp(ptr->data.name, name) == 0)
        {
            return ptr;
        }

        ptr = ptr->next;
    }
    return ptr;
}

// 单链表的判空
int IsEmpty_Sql_List(Link_list *list)
{
    if (list->next == NULL)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

// 双链表的合并
Link_list *merge_link_lists(Link_list *list1, Link_list *list2)
{
    Link_list *L_3 = init_link_list();
    Node *p1 = list1->next;
    size_t i;
    for (i = 1; p1 != NULL; i++)
    {
        insert_node(L_3, p1->data, i);
        p1 = p1->next;
    }
    p1 = list2->next;
    for (; p1 != NULL; i++)
    {
        insert_node(L_3, p1->data, i);
        p1 = p1->next;
    }
    return L_3;
}
